#!/bin/bash
###############################################################################
#       脚本名称: test_utils_validate.sh
#       功能描述: Utils模块数据校验工具(utils_validate.sh)单元测试
#       作者: 林再来
#       日期: 2025-10-20
#       版本: 1.0
#       功能:
#           1、测试基础数据类型校验功能
#           2、测试特殊格式校验功能
#           3、测试配置内容校验功能
#           4、测试安全策略校验功能
#           5、测试辅助校验功能
###############################################################################

# 切换到脚本目录
cd "$(dirname "${BASH_SOURCE[0]}")" || exit 1

# 加载测试框架
source ../test_framework.sh

# 加载被测模块
source ../../../scripts/utils/utils_validate.sh

# 恢复shell选项（避免set -e影响测试框架）
set +e

# 创建临时测试目录
TEST_DIR=$(create_test_dir)

###############################################################################
# 基础数据类型校验测试
###############################################################################

# 测试: 必填参数校验
test_utils_validate_required() {
    # 测试有效值
    assert_success utils_validate_required 'test' '参数名'
    
    # 测试空值
    assert_failure utils_validate_required '' '参数名'
    
    # 测试null值
    assert_success utils_validate_required 'null' '参数名'
}

# 测试: 整数校验
test_utils_validate_integer() {
    # 测试有效整数
    assert_success utils_validate_integer '123' '整数'
    
    assert_success utils_validate_integer '-456' '整数'
    
    assert_success utils_validate_integer '0' '整数'
    
    # 测试无效整数
    assert_failure utils_validate_integer '12.34' '整数'
    
    assert_failure utils_validate_integer 'abc' '整数'
    
    assert_failure utils_validate_integer '' '整数'
}

# 测试: 浮点数校验
test_utils_validate_float() {
    # 测试有效浮点数
    assert_success utils_validate_float '123.45' '浮点数'
    
    assert_success utils_validate_float '-67.89' '浮点数'
    
    assert_success utils_validate_float '100' '浮点数'
    
    # 测试无效浮点数
    assert_failure utils_validate_float 'abc.def' '浮点数'
    
    assert_failure utils_validate_float '' '浮点数'
}

# 测试: 布尔值校验
test_utils_validate_boolean() {
    # 测试有效布尔值
    assert_success utils_validate_boolean 'true' '布尔值'
    
    assert_success utils_validate_boolean 'false' '布尔值'
    
    assert_success utils_validate_boolean '1' '布尔值'
    
    assert_success utils_validate_boolean '0' '布尔值'
    
    assert_success utils_validate_boolean 'yes' '布尔值'
    
    assert_success utils_validate_boolean 'no' '布尔值'
    
    # 测试无效布尔值
    assert_failure utils_validate_boolean 'maybe' '布尔值'
    
    assert_failure utils_validate_boolean '' '布尔值'
}

# 测试: 字符串校验
test_utils_validate_string() {
    # 测试有效字符串
    assert_success utils_validate_string 'hello' 0 '' '字符串'
    
    # 测试长度限制
    assert_failure utils_validate_string 'hi' 3 '' '字符串'
    
    assert_failure utils_validate_string 'hello' 0 3 '字符串'
    
    # 测试空值
    assert_failure utils_validate_string '' 0 '' '字符串'
}

# 测试: 数组校验
test_utils_validate_array() {
    # 测试有效数组
    assert_success utils_validate_array 'item1 item2 item3' '数组'
    
    assert_success utils_validate_array '[1,2,3]' '数组'
    
    # 测试无效数组
    assert_failure utils_validate_array '' '数组'
}

# 测试: 对象校验
test_utils_validate_object() {
    # 测试有效对象
    assert_success utils_validate_object '{"name":"test","value":123}' '对象'
    
    # 测试无效对象
    assert_failure utils_validate_object 'invalid' '对象'
    
    assert_failure utils_validate_object '' '对象'
}

###############################################################################
# 特殊格式校验测试
###############################################################################

# 测试: 邮箱地址校验
test_utils_validate_email() {
    # 测试有效邮箱
    assert_success utils_validate_email 'test@example.com' '邮箱'
    
    assert_success utils_validate_email 'user.name+tag@domain.co.uk' '邮箱'
    
    # 测试无效邮箱
    assert_failure utils_validate_email 'invalid-email' '邮箱'
    
    assert_failure utils_validate_email '@example.com' '邮箱'
    
    assert_failure utils_validate_email 'test@' '邮箱'
    
    assert_failure utils_validate_email '' '邮箱'
}

# 测试: URL地址校验
test_utils_validate_url() {
    # 测试有效URL
    assert_success utils_validate_url 'https://www.example.com' 'URL'
    
    assert_success utils_validate_url 'http://example.com/path' 'URL'
    
    # 测试无效URL
    assert_failure utils_validate_url 'ftp://example.com' 'URL'
    
    assert_failure utils_validate_url 'not-a-url' 'URL'
    
    assert_failure utils_validate_url '' 'URL'
}

# 测试: IP地址校验
test_utils_validate_ip() {
    # 测试有效IP
    assert_success utils_validate_ip '192.168.1.1' 'IP地址'
    
    assert_success utils_validate_ip '127.0.0.1' 'IP地址'
    
    assert_success utils_validate_ip '255.255.255.255' 'IP地址'
    
    # 测试无效IP
    assert_failure utils_validate_ip '256.1.1.1' 'IP地址'
    
    assert_failure utils_validate_ip '192.168.1' 'IP地址'
    
    assert_failure utils_validate_ip 'not-an-ip' 'IP地址'
    
    assert_failure utils_validate_ip '' 'IP地址'
}

# 测试: MAC地址校验
test_utils_validate_mac() {
    # 测试有效MAC
    assert_success utils_validate_mac "00:11:22:33:44:55" "MAC地址"
    
    assert_success utils_validate_mac "00-11-22-33-44-55" "MAC地址"
    
    # 测试无效MAC
    assert_failure utils_validate_mac "00:11:22:33:44" "MAC地址"
    
    assert_failure utils_validate_mac "GG:11:22:33:44:55" "MAC地址"
    
    assert_failure utils_validate_mac "" "MAC地址"
}

# 测试: 电话号码校验
test_utils_validate_phone() {
    # 测试有效电话
    assert_success utils_validate_phone "13800138000" "电话号码"
    
    assert_success utils_validate_phone "(010) 1234-5678" "电话号码"
    
    assert_success utils_validate_phone "+86-138-0013-8000" "电话号码"
    
    # 测试无效电话
    assert_failure utils_validate_phone "123" "电话号码"
    
    assert_failure utils_validate_phone "12345678901234567890" "电话号码"
    
    assert_failure utils_validate_phone "abc-def-ghij" "电话号码"
    
    assert_failure utils_validate_phone "" "电话号码"
}

# 测试: 日期格式校验
test_utils_validate_date() {
    # 测试有效日期
    assert_success utils_validate_date "2025-01-02" "日期"
    
    assert_success utils_validate_date "2025/01/02" "日期"
    
    # 测试无效日期
    assert_failure utils_validate_date "2025-13-01" "日期"
    
    assert_failure utils_validate_date "2025-01-32" "日期"
    
    assert_failure utils_validate_date "not-a-date" "日期"
    
    assert_failure utils_validate_date "" "日期"
}

# 测试: 时间格式校验
test_utils_validate_time() {
    # 测试有效时间
    assert_success utils_validate_time "12:30:45" "时间"
    
    assert_success utils_validate_time "12:30" "时间"
    
    assert_success utils_validate_time "00:00:00" "时间"
    
    assert_success utils_validate_time "23:59:59" "时间"
    
    # 测试无效时间
    assert_failure utils_validate_time "24:00:00" "时间"
    
    assert_failure utils_validate_time "12:60:00" "时间"
    
    assert_failure utils_validate_time "12:30:60" "时间"
    
    assert_failure utils_validate_time "not-a-time" "时间"
    
    assert_failure utils_validate_time "" "时间"
}

###############################################################################
# 配置内容校验测试
###############################################################################

# 测试: 必填字段校验
test_utils_validate_required_field() {
    # 测试有效字段
    assert_success utils_validate_required_field "value" "field_name" "config.yaml"
    
    # 测试空字段
    assert_failure utils_validate_required_field "" "field_name" "config.yaml"
}

# 测试: 字段类型校验
test_utils_validate_field_type() {
    # 测试整数类型
    assert_success utils_validate_field_type "123" "integer" "port" "config.yaml"
    
    # 测试浮点数类型
    assert_success utils_validate_field_type "123.45" "float" "rate" "config.yaml"
    
    # 测试布尔类型
    assert_success utils_validate_field_type "true" "boolean" "enabled" "config.yaml"
    
    # 测试字符串类型
    assert_success utils_validate_field_type "hello" "string" "name" "config.yaml"
    
    # 测试邮箱类型
    assert_success utils_validate_field_type "test@example.com" "email" "email" "config.yaml"
    
    # 测试URL类型
    assert_success utils_validate_field_type "https://example.com" "url" "url" "config.yaml"
    
    # 测试IP类型
    assert_success utils_validate_field_type "192.168.1.1" "ip" "ip" "config.yaml"
    
    # 测试无效类型
    assert_failure utils_validate_field_type "123" "invalid_type" "field" "config.yaml"
}

# 测试: 字段值范围校验
test_utils_validate_field_range() {
    # 测试有效范围
    assert_success utils_validate_field_range "50" "0" "100" "percentage" "config.yaml"
    
    # 测试边界值
    assert_success utils_validate_field_range "0" "0" "100" "percentage" "config.yaml"
    
    assert_success utils_validate_field_range "100" "0" "100" "percentage" "config.yaml"
    
    # 测试超出范围
    assert_failure utils_validate_field_range "-1" "0" "100" "percentage" "config.yaml"
    
    assert_failure utils_validate_field_range "101" "0" "100" "percentage" "config.yaml"
    
    # 测试非数字
    assert_failure utils_validate_field_range "abc" "0" "100" "percentage" "config.yaml"
}

# 测试: 一致性校验
test_utils_validate_consistency() {
    # 测试一致值
    assert_success utils_validate_consistency "password" "password" "password" "confirm_password" "config.yaml"
    
    # 测试不一致值
    assert_failure utils_validate_consistency "password1" "password2" "password" "confirm_password" "config.yaml"
}

# 测试: 依赖关系校验
test_utils_validate_dependency() {
    # 测试有效依赖
    assert_success utils_validate_dependency "value1" "value2" "field1" "field2" "config.yaml"
    
    # 测试无效依赖
    assert_failure utils_validate_dependency "value1" "" "field1" "field2" "config.yaml"
}

###############################################################################
# 安全策略校验测试
###############################################################################

# 测试: 密码强度校验
test_utils_validate_password_strength() {
    # 测试强密码
    assert_success utils_validate_password_strength 'Password123!' '密码'
    
    # 测试长度不足
    assert_failure utils_validate_password_strength 'Pass1!' '密码'
    
    # 测试缺少大写字母
    assert_failure utils_validate_password_strength 'password123!' '密码'
    
    # 测试缺少小写字母
    assert_failure utils_validate_password_strength 'PASSWORD123!' '密码'
    
    # 测试缺少数字
    assert_failure utils_validate_password_strength 'Password!' '密码'
    
    # 测试缺少特殊字符
    assert_failure utils_validate_password_strength 'Password123' '密码'
    
    # 测试空密码
    assert_failure utils_validate_password_strength '' '密码'
}

###############################################################################
# 辅助函数测试
###############################################################################

# 测试: 数字校验
test_utils_validate_number() {
    # 测试有效数字
    assert_success utils_validate_number '123' '数字'
    
    assert_success utils_validate_number '123.45' '数字'
    
    assert_success utils_validate_number '-67.89' '数字'
    
    # 测试无效数字
    assert_failure utils_validate_number 'abc' '数字'
    
    assert_failure utils_validate_number '' '数字'
}

###############################################################################
# 运行测试
###############################################################################

echo "========================================"
echo "测试套件: Utils模块数据校验工具 (utils_validate.sh)"
echo "========================================"

# 基础数据类型校验测试
run_test "必填参数校验" test_utils_validate_required
run_test "整数校验" test_utils_validate_integer
run_test "浮点数校验" test_utils_validate_float
run_test "布尔值校验" test_utils_validate_boolean
run_test "字符串校验" test_utils_validate_string
run_test "数组校验" test_utils_validate_array
run_test "对象校验" test_utils_validate_object

# 特殊格式校验测试
run_test "邮箱地址校验" test_utils_validate_email
run_test "URL地址校验" test_utils_validate_url
run_test "IP地址校验" test_utils_validate_ip
run_test "MAC地址校验" test_utils_validate_mac
run_test "电话号码校验" test_utils_validate_phone
run_test "日期格式校验" test_utils_validate_date
run_test "时间格式校验" test_utils_validate_time

# 配置内容校验测试
run_test "必填字段校验" test_utils_validate_required_field
run_test "字段类型校验" test_utils_validate_field_type
run_test "字段值范围校验" test_utils_validate_field_range
run_test "一致性校验" test_utils_validate_consistency
run_test "依赖关系校验" test_utils_validate_dependency

# 安全策略校验测试
run_test "密码强度校验" test_utils_validate_password_strength

# 辅助函数测试
run_test "数字校验" test_utils_validate_number

echo "----------------------------------------"
echo "测试套件 [Utils模块数据校验工具 (utils_validate.sh)] 完成"
echo "----------------------------------------"
